2348-全 0 子数组的数目

Raphael Liu Lv10

给你一个整数数组 nums ,返回全部为 0子数组 数目。

子数组 是一个数组中一段连续非空元素组成的序列。

示例 1:

**输入:** nums = [1,3,0,0,2,0,0,4]
**输出:** 6
**解释:**
子数组 [0] 出现了 4 次。
子数组 [0,0] 出现了 2 次。
不存在长度大于 2 的全 0 子数组,所以我们返回 6 。

示例 2:

**输入:** nums = [0,0,0,2,0,0]
**输出:** 9
**解释:** 子数组 [0] 出现了 5 次。
子数组 [0,0] 出现了 3 次。
子数组 [0,0,0] 出现了 1 次。
不存在长度大于 3 的全 0 子数组,所以我们返回 9 。

示例 3:

**输入:** nums = [2,10,2019]
**输出:** 0
**解释:** 没有全 0 子数组,所以我们返回 0 。

提示:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109

本题 视频讲解 已出炉,欢迎点赞三连,在评论区分享你对这场双周赛的看法~


考虑每个以 0 结尾的子数组的个数。

做法:统计连续 0 组成的长度 c,每个 c 可以贡献 c 个子数组。

[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
class Solution:
def zeroFilledSubarray(self, nums: List[int]) -> int:
ans = c = 0
for x in nums:
if x:
c = 0
else:
c += 1
ans += c
return ans
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
class Solution {
public long zeroFilledSubarray(int[] nums) {
var ans = 0L;
var c = 0;
for (var num : nums)
if (num != 0) c = 0;
else ans += ++c;
return ans;
}
}
[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
long long zeroFilledSubarray(vector<int> &nums) {
long ans = 0L;
int c = 0;
for (int num : nums)
if (num) c = 0;
else ans += ++c;
return ans;
}
};
[sol1-Go]
1
2
3
4
5
6
7
8
9
10
11
12
func zeroFilledSubarray(nums []int) (ans int64) {
c := 0
for _, num := range nums {
if num == 0 {
c++
ans += int64(c)
} else {
c = 0
}
}
return
}
 Comments
On this page
2348-全 0 子数组的数目